package com.zenithmind.task.service.base;

import com.zenithmind.task.pojo.vo.TaskDependencyVO;

import java.util.List;

/**
 * 任务依赖管理服务接口
 * 遵循接口隔离原则：专门处理任务依赖相关操作
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
public interface TaskDependencyManagementService {

    /**
     * 添加任务依赖
     * 
     * @param predecessorId 前置任务ID
     * @param successorId 后续任务ID
     * @param dependencyType 依赖类型
     * @param lagDays 延迟天数
     * @param userId 操作者ID
     * @return 添加结果
     */
    Boolean addTaskDependency(String predecessorId, String successorId, Integer dependencyType, 
                             Integer lagDays, String userId);

    /**
     * 移除任务依赖
     * 
     * @param predecessorId 前置任务ID
     * @param successorId 后续任务ID
     * @param userId 操作者ID
     * @return 移除结果
     */
    Boolean removeTaskDependency(String predecessorId, String successorId, String userId);

    /**
     * 查询任务的前置依赖
     * 
     * @param taskId 任务ID
     * @param userId 用户ID
     * @return 前置依赖列表
     */
    List<TaskDependencyVO> getTaskPredecessors(String taskId, String userId);

    /**
     * 查询任务的后续依赖
     * 
     * @param taskId 任务ID
     * @param userId 用户ID
     * @return 后续依赖列表
     */
    List<TaskDependencyVO> getTaskSuccessors(String taskId, String userId);

    /**
     * 检查循环依赖
     * 
     * @param predecessorId 前置任务ID
     * @param successorId 后续任务ID
     * @return 是否存在循环依赖
     */
    Boolean checkCircularDependency(String predecessorId, String successorId);

    /**
     * 获取任务依赖路径
     * 
     * @param taskId 任务ID
     * @param userId 用户ID
     * @return 依赖路径
     */
    List<List<TaskDependencyVO>> getDependencyPaths(String taskId, String userId);

    /**
     * 检查任务是否可以开始
     * 
     * @param taskId 任务ID
     * @param userId 用户ID
     * @return 是否可以开始
     */
    Boolean canTaskStart(String taskId, String userId);

    /**
     * 获取关键路径
     * 
     * @param projectId 项目ID
     * @param userId 用户ID
     * @return 关键路径
     */
    List<TaskDependencyVO> getCriticalPath(String projectId, String userId);
}
